package cn.kingshion.juc;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * CopyOnWriteArrayList  /  CopyOnWriteArraySet ："写入复制"
 * 注意：添加操作多的时候，效率低，因为每次添加操作时都会进行复制，开消费非常大。并发迭代操作多的时候可以选择。
 */
public class CopyOnWriteArrayListTest {
    public static void main(String[] args) {
        HelloThread helloThread = new HelloThread();

        for (int i = 0; i < 10; i++) {
            new Thread(helloThread).start();
        }
    }


}

class HelloThread implements Runnable {
    // 此时会报错，java.util.ConcurrentModificationException
    // 报错原因是后面run方法里面对list进行了迭代，在迭代的同时对list进行了数据的插入。
    //    private static List<String> list = Collections.synchronizedList(new ArrayList<String>());

    // 采用 CopyOnWriteArrayList 操作。
    // 底层在每次写入的时候都会进行一次复制一个全新的list 所以就不会产生并发修改异常。但是不适合添加操作多的时候，但是比较适合迭代。
    private static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();

    // 静态代码块添加数据
    static {
        list.add("jjx");
        list.add("kignshion");
        list.add("ysy");
    }

    @Override
    public void run() {
        Iterator<String> iterator = list.iterator();

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
            list.add("boy");
        }

    }
}
